from collections import Iterable
import os

# 字典是可迭代对象
print("字典是可迭代对象")
d = {"name": "zhangsan", "age": 44, "city": "xian"}
for key, value in d.items():
    print(key, value)


# 字符串也是可以迭代的对象
print("字符串也是可以迭代的对象")
city = 'Peking'
for item in city:
    print(item)

# 判断对象是否是可以迭代的对象
print("字典是否是可以迭代的对象", isinstance(d, Iterable))
print("字符串是否是可以迭代的对象", isinstance(city, Iterable))
print("整数是否是可以迭代的对象", isinstance(123, Iterable))

# 使用下标对list进行访问
for i, value in enumerate(['guanszhou', 'shanghai', 'shenzhen']):
    print("下标为", i, "的元素为", value)

# 列表生成式
print("使用list函数配合range函数生成列表", list(range(1, 11)))

# 列表生成式
print("列表生成式", [x*x for x in range(1, 11)])

# 列表生成式后边还可以跟if语句进行过滤处理
print("列表生成式带条件：", [x*x for x in range(1, 11) if x % 2 == 0])

# 列表生成式使用两层循环生成全排列
print("列表生成式使用双层循环生成全排列：", [m+n for m in 'ABC' for n in 'XYZ'])

# 使用列表生成式列出当前目录下所有文件和目录名称
print("列表生成式生成当前目录下所有文件和目录名称：", [fileName for fileName in os.listdir('.')])

# 使用列表生成式使用for循环的多个变量
d = {"province":"shannxi", "city":"xian"}
print("使用列表生成式使用for循环的多个变量：", [k + '=' + v for k, v in d.items()])

# 列表生成式前面加if代表条件语句，必须加else,加在后面是过滤条件，不需要加else
print("列表生成式前面加if语句", [x if x % 2 == 0 else -x for x in range(1, 11)])

# 生成器的
print(type(10))
g  = (x for x in range(1, 4))
print("g的数据类型是", type(g))

# 遍历生成器的元素
for i in g:
    print("当前生成器的元素是：", i)

# 斐波那契数列
def fib(x):
    n, a, b = 0, 0, 1
    while n < x:
        yield(b)
        a, b=b, a+b
        n = n+1
    return 'done'

# 使用for循环拿不到生成器的返回值
for i in fib(6):
    print(i)
fib6 = fib(6)
while True:
    try:
        x = next(fib6)
        print(x)
    except StopIteration as e:
        print("生成器的返回值是：", e.value)
        break